package org.example.mallcommon.tool;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 订单号生成工具类
 */
public class OrderNoGenerator {

    // 使用原子计数器确保线程安全
    private static final AtomicLong counter = new AtomicLong(0);

    // 机器ID或业务标识(可根据实际需求配置)
    private static final String MACHINE_ID = "01";

    // 最大计数器值(9999)
    private static final long MAX_COUNTER = 9999L;

    // 日期格式
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

    /**
     * 生成唯一订单号
     * 格式: 年月日时分秒(14位) + 机器ID(2位) + 随机数(2位) + 序列号(4位)
     * 示例: 2023111514304501781234
     * @return 唯一订单号
     */
    public static synchronized String generateOrderNo() {
        // 1. 获取当前时间戳
        String timestamp = dateFormat.format(new Date());

        // 2. 获取并递增计数器(循环计数)
        long seq = counter.incrementAndGet();
        if (seq > MAX_COUNTER) {
            counter.set(0);
            seq = 0;
        }

        // 3. 生成2位随机数
        String random = String.format("%02d", new Random().nextInt(100));

        // 4. 组合各部分
        return timestamp + MACHINE_ID + random + String.format("%04d", seq);
    }

    /**
     * 测试方法
     */
    public static void main(String[] args) {
        // 生成10个订单号测试
        for (int i = 0; i < 10; i++) {
            System.out.println(generateOrderNo());
        }
    }
}